我們的遊戲現在只會在結束時顯示一次分數,這樣就少了一點樂趣。因此今天我們將最高的分數紀錄到檔案系統中保存,並在遊戲結束時顯示。
儲存到檔案系統也可以讓我們在關閉遊戲後仍然保存著我們的資料並在下一次啟動時回復資料,大部分的遊戲中會是很重要的功能!
這次的程式修改主要是使用官方範例做些微調整,可以到官網看更詳細介紹。
介紹 FileAccess
Provides methods for file reading and writing operations.
This class can be used to permanently store data in the user device's file system and to read from it. This is useful for store game save data or player configuration files.
這個類別讓我們能夠儲存一些永久性的資料並從中讀取,可以用來儲存遊戲資料以及玩家資訊等等。
var highest_score: float = 0.00
var saved_location: String = "user://savegame.save"
func save_game():
# 從我們的顯示分數的 label 取得此次的分數。
var score = float(score_label.text)
# 若大於最高分則更新結果並儲存到檔案系統中。
if score > highest_score:
# 更新紀錄。
highest_score = score
# 以寫入權限開啟檔案。
var save_game = FileAccess.open(saved_location, FileAccess.WRITE)
var save_dict = {
"highest_score" : str(highest_score)
}
# 轉為 json 格式。
var json_string = JSON.stringify(save_dict)
# 寫入檔案
save_game.store_line(json_string)
# 離開後自動關閉檔案。
func handle_game_end():
# ...
hud.save_game()
func load_game():
# 如果檔案不存在則不做處理。
if not FileAccess.file_exists(saved_location):
return
# 以讀取權限開啟檔案。
var save_game = FileAccess.open(saved_location, FileAccess.READ)
# 如果現在的位置還沒有到檔案總長則繼續讀取。
while save_game.get_position() < save_game.get_length():
# 讀取行。
var json_string = save_game.get_line()
# 解析 json 格式
var json = JSON.new()
var parse_result = json.parse(json_string)
# 若錯誤顯示錯誤訊息
if not parse_result == OK:
print("JSON Parse Error: ", json.get_error_message(), " in ", json_string, " at line ", json.get_error_line())
continue
# 獲得結果字典
var data = json.get_data()
# 取出需要的值
highest_score = float(data["highest_score"])
func _ready():
# ...
load_game()
message_label.text = "Highest score : \n" + str(highest_score) + "\n\nRUN!!"
專案
-> 打開使用者資料資料夾
下找到。HUD
檔案
extends CanvasLayer
signal game_start
signal game_pause
signal game_unpause
var message_label:Label
var score_label:Label
var start_button:Button
var pause_button:Button
var message_timer:Timer
var is_stop:bool = false
# record highest score
var highest_score: float = 0.00
var saved_location: String = "user://savegame.save"
func _ready():
message_label = $Message
score_label = $Score
start_button = $StartButton
pause_button = $PauseButton
message_timer = $MessageTimer
start_button.pressed.connect(_on_start_button_pressed)
pause_button.pressed.connect(_on_pause_button_pressed)
message_timer.timeout.connect(_on_message_timer_timout)
load_game()
message_label.text = "Highest score : \n" + str(highest_score) + "\n\nRUN!!"
func _on_start_button_pressed():
# ...
func _on_pause_button_pressed():
# ...
func _on_message_timer_timout():
# ...
func show_message(text: String, wait_time: float=2):
# ...
func show_game_start():
# ...
func show_game_pause():
# ...
func show_game_unpause():
# ...
func show_game_over():
# ...
func update_score(score):
# ...
func load_game():
if not FileAccess.file_exists(saved_location):
return
var save_game = FileAccess.open(saved_location, FileAccess.READ)
while save_game.get_position() < save_game.get_length():
var json_string = save_game.get_line()
var json = JSON.new()
var parse_result = json.parse(json_string)
if not parse_result == OK:
print("JSON Parse Error: ", json.get_error_message(), " in ", json_string, " at line ", json.get_error_line())
continue
var data = json.get_data()
highest_score = float(data["highest_score"])
func save_game():
var score = float(score_label.text)
if score > highest_score:
highest_score = score
var save_game = FileAccess.open(saved_location, FileAccess.WRITE)
var save_dict = {
"highest_score" : str(highest_score)
}
var json_string = JSON.stringify(save_dict)
save_game.store_line(json_string)
:)